%no : nomor soal berdasarkan soal tugas
%A  : matriks data
function [hasil] = mn_spline(A, titik_interpolasi, axes1)
%MN_SPLINE Summary of this function goes here
%   Detailed explanation goes here

if (length(A(1,:))==2)          %interpolasi 1 peubah
    X = A(:,1);
    Y = A(:,2);
    
    N = length(X);
    D = zeros(1, N - 2);            %D adalah nilai kecil dari persamaan tridiagonal
    C = zeros(1, N - 2);            %C adalah nilai besar dari persamaan tridiagonal
    B = zeros(1, N - 2);            %B adalah nilai tengah dari persamaan tridiagonal
    R = zeros(1, N - 2);            %R adalah nilai hasil dari persamaan tridiagonal
    S_temp = zeros(1, N - 2);      %S_aksen adalah hasil persamaan tridiagonal
    S_aksen = zeros(1, N);
    
    % Peroleh persamaan tridiagonal, hasilnya adalah S``(x0) hingga S``(xn)
    for i = 2 : N - 1
        if(i > 2)
            D(i - 2) = X(i) - X(i-1);
        end
        B(i - 1) = 2 * (X(i + 1) - X(i - 1));
        if(i < N - 1)
            C(i - 1) = X(i + 1) - X(i);
        end
        R(i - 1) = (6 / (X(i + 1) - X(i)) * (Y(i + 1) - Y(i))) + (6 / (X(i) - X(i - 1)) * (Y(i - 1) - Y(i)));
    end
    S_temp = tridiagonal(D, B, C, R);
    S_aksen = [0 S_temp 0];

    % Gambar hasil interpolasi
    for xx=A(1,1):A(length(A(:,1)),1)
        sub = 1;
        for i = 1 : N - 1
            sub = i;
            if(xx < X(i + 1))
                break;
            end
        end
        
        jumlah = (S_aksen(sub) / (6 * (X(sub + 1) - X(sub))) * (X(sub + 1) - xx) * (X(sub + 1) - xx) * (X(sub + 1) - xx)) + (S_aksen(sub + 1) / (6 * (X(sub + 1) - X(sub))) * (xx - X(sub)) * (xx - X(sub)) * (xx - X(sub))) + ((Y(sub) / (X(sub + 1) - X(sub))) - (S_aksen(sub) * (X(sub + 1) - X(sub)) / 6)) * (X(sub + 1) - xx) + ((Y(sub + 1) / (X(sub + 1) - X(sub))) - (S_aksen(sub + 1) * (X(sub + 1) - X(sub)) / 6)) * (xx - X(sub));

        P(xx-A(1,1)+1,1) = xx;
        P(xx-A(1,1)+1,2) = jumlah;
    end
    axis(axes1);
    cla(axes1,'reset');
    plot(P(:,1),P(:,2),'b');
    hold on;
    plot(A(:,1),A(:,2),'r*');

    % Cari selang terdekat dengan titik interpolasi
    sub = 1;
    for i = 1 : N - 1
        sub = i;
        if(titik_interpolasi < X(i + 1))
            break;
        end
    end

    % Kembalikan hasil interpolasi
    hasil = (S_aksen(sub) / (6 * (X(sub + 1) - X(sub))) * (X(sub + 1) - titik_interpolasi) * (X(sub + 1) - titik_interpolasi) * (X(sub + 1) - titik_interpolasi)) + (S_aksen(sub + 1) / (6 * (X(sub + 1) - X(sub))) * (titik_interpolasi - X(sub)) * (titik_interpolasi - X(sub)) * (titik_interpolasi - X(sub))) + ((Y(sub) / (X(sub + 1) - X(sub))) - (S_aksen(sub) * (X(sub + 1) - X(sub)) / 6)) * (X(sub + 1) - titik_interpolasi) + ((Y(sub + 1) / (X(sub + 1) - X(sub))) - (S_aksen(sub + 1) * (X(sub + 1) - X(sub)) / 6)) * (titik_interpolasi - X(sub));

elseif (length(A(1,:))==3)      %interpolasi 2 peubah
end

end

